/* 实现 Promise 注意点：
    1. Promise 是一个类 class，执行类时需要传递一个执行器，且立即执行
    2. Promise 三种状态：成功 fulfilled 失败 rejected 等待 pending
        pending -> fulfilled
        pending -> rejected
        一旦状态确定就不可更改
    3. resolve 和 reject 是用来改变状态的
    4. then 方法内部判断任务状态，成功则调用成功回调，反之亦然，then 方法定义在原型对象中
    5. then 成功回调的参数表示成功后的值，失败回调的参数表示失败原因
    6. 同一个 promise 对象下面的 then 方法是可以被调用多次的
    7. then 方法是可以被链式调用的, 后面 then 方法的回调函数拿到值的是上一个 then 方法的回调函数的返回值
    8. then 方法不能返回本 promise 对象，否则会发生循环调用错误
    9. try catch 错误捕获要注意两个地方，promise 的执行器函数内部异常、回调函数内部异常(成功 失败 pending)
    10. then 方法应该为可选传递，如果为空，则将上一个 then 方法返回的内容向下传递
    11. all 静态方法，处理异步并发，传入任务数组，返回对应顺序的结果数组，如果任务都成功则成功，如果任何一个任务失败则失败 （对比 race 方法）
    12. resolve 静态方法，返回一个包含将传入的值作为返回值的 Promise 对象
    13. finally 方法，无论当前 promise 任务是成功还是失败都要能够执行，并在后面还能链式调用 then 方法
    14. catch 方法，链上的错误捕获
*/
let APromise = require('./aPromise')
// console.log(APromise);
// let promise = new APromise((resolve, reject) => {
//     setTimeout(() => {
//         // if(Math.random() < 0.5) {
//             // Math.geowig()  // 错误捕获测试
//             // resolve('success')
//         // } else {
//             reject('fail')
//         // }
//     }, 2000);
// })

// let p1 = promise.then()
// .then()
// .then(value => {
//     console.log('1', value)
//     // Math.geowig()  // 错误捕获测试

//     // return p1
//     // return new APromise((resolve, reject) => {
//     //     resolve('other')
//     // });
//     return 'aaa'
// }, error => {
//     console.log('1', error)
//     Math.geowig()  // 错误捕获测试
// })

// p1.then(value2 => {
//     console.log(value2)
// }, reason => {
//     console.log(reason.message)
// })

function p1 () {
    return new APromise(function (resolve, reject) {
        setTimeout(function () {
            resolve('p1')
        }, 2000)
    })
}
function p2 () {
    return new APromise(function (resolve, reject) {
        reject('失败')
        // resolve('成功');  
    })
}

// all 方法
// APromise.all(['1', '2', p1(), p2(), '3']).then(value => {
//     console.log(value)
// }, reason => {
//     console.log(reason)
// })

// resolve 方法
// APromise.resolve('value2').then(console.log)
// APromise.resolve(p1()).then(console.log, console.log)

// finally
// p2().finally(value => {
//     console.log('final', value)
//     return p1()
// }).then(console.log, console.log)

// catch
p2().then(console.log)
    .catch(console.log)
